package session

import (
	"errors"
	"sync"
	"github.com/satori/go.uuid"
)

//    MemorySeesionMgr设计：
//    定义MemorySeesionMgr对象（字段：存放所有session的map，读写锁）
//    构造函数
//    Init()
//    CreateSeesion()
//    GetSession()

type MemorySeesionMgr struct {
	sessionMap map[string]Session
	rwlock sync.RWMutex
}

// 构造函数
func NewMemorySeesionMgr() SessionMgr{
	sr := &MemorySessionMgr{
		sessionMap: make(map[string]Session, 1024),
	}
	return sr
}

func (s *MemorySeesionMgr) Init(addr string, options ...string) (err error){
	return
}

// 创建session
func (s *MemorySeesionMgr) CreateSession() (session Session, err error){
	s.rwlock.Lock()
	defer s.rwlock.Unlock()
	// go get github.com/satori/go.uuid
	// 用uuid作为sessionId
	id, err := uuid.NewV4()
	if err != nil{
		return
	}
	// 转string
	sessionId := id.String()
	// 创建单个session
	session = NewMemorySession(sessionId)
	// 加入到大map
	s.sessionMap[sessionId] = session

	return
}

func (s *MemorySeesionMgr) Get(sessionId string) (session Session, err error){
	s.rwlock.Lock()
	defer s.rwlock.Unlock()
	session, ok := s.sessionMap[sessionId]
	if !ok{
		err = errors.New("session not exist")
		return
	}
	return
}